<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>http://javascript.ruanyifeng.com/oop/basic.html</title>
</head>
<body>
<form action="1.php" id="uploadForm" enctype="multipart/form-data" method="post">
    <input type="file" name="file" id="file"/>
    <input type="submit">
</form>
</body>
</html>

<script type="text/javascript">
    function Fubar(foo, bar){
        if (!(this instanceof Fubar)) {
            return new Fubar(foo, bar);
        }

        this._foo = foo;
        this._bar = bar;
    }

    console.log(Fubar(1, 2)._foo); // 1
    console.log(new Fubar(1, 2)._foo); // 1



//    new命令的原理

//    创建一个空对象，作为将要返回的对象实例
//    将这个空对象的原型，指向构造函数的prototype属性
//    将这个空对象赋值给函数内部的this关键字
//    开始执行构造函数内部的代码


    function _new(/* 构造函数 */ constructor, /* 构造函数参数 */ param1) {
        // 将 arguments 对象转为数组
        var args = [].slice.call(arguments);
        // 取出构造函数
        var constructor = args.shift();
        // 创建一个空对象，继承构造函数的 prototype 属性
        var context = Object.create(constructor.prototype);
        // 执行构造函数
        var result = constructor.apply(context, args);
        // 如果返回结果是对象，就直接返回，则返回 context 对象
        return (typeof result === 'object' && result != null) ? result : context;
    }

    // 实例
    var actor = _new(Person, '张三', 28);
</script>